#include <iostream>
#include <future>
#include <chrono>
#include <memory>
int add(int num1, int num2)
{
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return num1 + num2;
}
int main()
{
    // 封装任务
    // std::packaged_task<int(int, int)> task(add);
    // 此处可执⾏其他操作, ⽆需等待
    // std::cout << "hello bit!" << std::endl;
    // std::future<int> result_future = task.get_future();
    // 需要注意的是，task虽然重载了()运算符，但task并不是⼀个函数，
    // std::async(std::launch::async, task, 1, 2); //--错误⽤法
    // 所以导致它作为线程的⼊⼝函数时，语法上看没有问题，但是实际编译的时候会报错
    // std::thread(task, 1, 2); //---错误⽤法
    // ⽽packaged_task禁⽌了拷⻉构造，
    // 且因为每个packaged_task所封装的函数签名都有可能不同，因此也⽆法当作参数⼀样传递
    // 传引⽤不可取，毕竟任务在多线程下执⾏存在局部变量声明周期的问题，因此不能传引⽤
    // 因此想要将⼀个packaged_task进⾏异步调⽤，
    // 简单⽅法就只能是new packaged_task，封装函数传地址进⾏解引⽤调⽤了
    // ⽽类型不同的问题，在使⽤的时候可以使⽤类型推导来解决
    auto task = std::make_shared<std::packaged_task<int(int, int)>>(add);
    std::future<int> result_future = task->get_future();
    std::thread thr([task]()
                    { (*task)(1, 2); });
    thr.detach();
    // 获取异步任务结果
    int result = result_future.get();
    std::cout << "Result: " << result << std::endl;
    return 0;
}